<?php


namespace app\back\model;


use think\facade\Db;
use think\response\Json;
use \Exception;

class DriverModel
{
    private static $_table = 'driver'; // 司机表
    private static $_routeTable = 'driver_route'; // 司机运输路线
    private static $_orgTable = 'organization'; // 机构
    /**添加司机
     * @param $input
     * @param $info
     * @return Json
     */
    public static function addDriver($input,$info)
    {
        $flag = false;
        try {
            // 查询账号和手机是否被注册
            $map1 = [
                ['account', '=', $input['account']]
            ];
            $map2 = [
                ['phone', '=', $input['phone']]
            ];
            $driverInfo = Db::table(self::$_table)->field('account,phone')->whereOr([$map1, $map2])->find();
            if ($driverInfo['account'] == $input['account']) return jsonFail('该账号已被注册');
            if ($driverInfo['phone'] == $input['phone']) return jsonFail('该手机号已被使用');
            $input['pwd'] = sha1($input['pwd']);
            unset($input['repwd']);
            $input['admin_id'] = $info['id'];
            $input['create_time'] = time();
            // 获取分拣中心
            $map = [
                ['admin_id', '=', $info['id']],
                ['type', '=', 2],
                ['status', 'in', [1,2]]
            ];
            $centerInfos = Db::table(self::$_orgTable)->field('id as move_id')->where($map)->select()->toArray();
            Db::startTrans();
            $flag = true;
            // 添加司机
            $rtn = Db::table(self::$_table)->insertGetId($input);
            if ($rtn < 1) {
                Db::rollback();
                return jsonFail('添加失败');
            }
            if ($centerInfos) {
                // 添加司机绑定分拣中心路线
                foreach ($centerInfos as &$centerInfo) {
                    $centerInfo['driver_id'] = $rtn;
                    $centerInfo['type'] = 2;
                }
                $rtn = Db::table(self::$_routeTable)->insertAll($centerInfos);
                if ($rtn != count($centerInfos)) {
                    Db::rollback();
                    return jsonFail('添加失败');
                }
            }
            Db::commit();
            return jsonSuccess('添加成功');
        } catch (Exception $e) {
            if ($flag == true) Db::rollback();
            return jsonFail('服务内部错误~');
        }
    }

    /**获取司机列表
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getDriverList($input,$info)
    {
        try {
            $map = [
                ['admin_id', '=', $info['id']]
            ];
            if ($input['status'] !== '') {
                $map[] = ['status', '=', $input['status']];
            } else {
                $map[] = ['status', 'in', [1,2]];
            }
            if ($input['name'] !== '') $map[] = ['name', 'like', "%{$input['name']}%"];
            $field = 'id,name,account,status,create_time,gender,phone';
            $table = Db::table(self::$_table)->where($map)->field($field);
            $count = $table->count();
            if ($count == 0) return jsonSuccess('暂无数据', ['count' => 0,'list' => []]);
            $list = $table->page($input['page'], $input['limit'])->order('create_time', 'desc')->select()->toArray();
            return jsonSuccess('获取成功', ['count' => $count, 'list' => $list]);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**修改状态
     * @param $input
     * @param $info
     * @return Json
     */
    public static function changeStatus($input,$info)
    {
        $flag = false;
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            // 根据不同status执行不同操作
            Db::startTrans();
            $flag = true;
            $map = [
                ['id', '=', $input['id']],
                ['admin_id', '=', $info['id']],
                ['status', '=', $input['status'] == 1 ? 2 : 1]
            ];
            $rtn = Db::table(self::$_table)->where($map)->update(['status' => $input['status']]);
            if (!$rtn) {
                Db::rollback();
                return  jsonFail('数据没有更新，修改失败');
            }
            // 修改路线状态
            $map = [
                ['driver_id', '=', $input['id']],
                ['status', '=', $input['status'] == 1 ? 2 : 1]
            ];
            $count = Db::table(self::$_routeTable)->where($map)->count();
            $rtn = Db::table(self::$_routeTable)->where($map)->update(['status' => $input['status']]);
            if ($rtn != $count) {
                Db::rollback();
                return  jsonFail('修改失败');
            }
            Db::commit();
            return jsonSuccess('修改成功');
        } catch (Exception $e) {
            if ($flag == true) Db::rollback();
            return jsonFail('服务内部错误~');
        }
    }

    /**删除司机
     * @param $input
     * @param $info
     * @return Json
     */
    public static function delete($input,$info)
    {
        $flag = false;
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            // 根据不同status执行不同操作
            Db::startTrans();
            $flag = true;
            $map = [
                ['id', '=', $input['id']],
                ['admin_id', '=', $info['id']],
                ['status', '<>', 3]
            ];
            $rtn = Db::table(self::$_table)->where($map)->update(['status' => 3]);
            if (!$rtn) {
                Db::rollback();
                return  jsonFail('数据没有更新，删除失败');
            }
            // 修改路线状态
            $map = [
                ['driver_id', '=', $input['id']],
                ['status', '<>', 3]
            ];
            $count = Db::table(self::$_routeTable)->where($map)->count();
            $rtn = Db::table(self::$_routeTable)->where($map)->update(['status' => 3]);
            if ($rtn != $count) {
                Db::rollback();
                return  jsonFail('删除失败');
            }
            Db::commit();
            return jsonSuccess('删除成功');
        } catch (Exception $e) {
            if ($flag == true) Db::rollback();
            return jsonFail('服务内部错误~');
        }
    }

    /**强制修改司机密码
     * @param $input
     * @param $info
     * @return Json
     */
    public static function forcePwd($input,$info)
    {
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status,pwd')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            $pwd = sha1($input['pwd']);
            if ($driverInfo['pwd'] == $pwd) return jsonFail('密码修改前后一致无需修改');
            $map = [
                ['id', '=', $input['id']],
                ['admin_id', '=', $info['id']]
            ];
            $rtn = Db::table(self::$_table)->where($map)->update(['pwd' => $pwd]);
            if ($rtn) return jsonSuccess('修改密码成功');
            return jsonFail('修改前后密码一致无需修改');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**获取单个司机信息
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getOnly($input,$info)
    {
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status,id,phone,name,account,gender')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            unset($driverInfo['admin_id']);
            unset($driverInfo['status']);
            return jsonSuccess('获取成功', $driverInfo);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**编辑司机信息
     * @param $input
     * @param $info
     * @return Json
     */
    public static function edit($input,$info)
    {
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            $rtn = Db::table(self::$_table)->update($input);
            if ($rtn) return jsonSuccess('编辑成功');
            return jsonFail('数据无变化，编辑失败');
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**获取司机运输路线
     * @param $input
     * @param $info
     * @return Json
     */
    public static function getRoute($input,$info)
    {
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status,id')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            // 获取当前管理员下的所有有效机构
            $map = [
                ['admin_id', '=', $info['id']],
                ['status', '=', 1]
            ];
            $orgInfo = Db::table(self::$_orgTable)->field('id,name')->where($map)->select()->toArray();
            if (!$orgInfo) return jsonFail('未找到可用的机构');
            // 获取当前司机已有路线
            $routeInfo = Db::table(self::$_routeTable)->field('move_id')->where('driver_id', $input['id'])->order('move_id', 'asc')->select()->toArray();
            return jsonSuccess('获取成功', ['orgInfo' => $orgInfo, 'routeInfo' => array_column($routeInfo, 'move_id')]);
        } catch (Exception $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**编辑司机运输路线
     * @param $input
     * @param $info
     * @return Json
     */
    public static function editRoute($input,$info)
    {
        $flag = false;
        try {
            // 获取当前信息
            $driverInfo = Db::table(self::$_table)->field('admin_id,status')->where('id', $input['id'])->find();
            if (!$driverInfo) return jsonFail('未找到司机信息');
            if ($driverInfo['admin_id'] != $info['id']) return jsonFail('该司机非您直接管理，您没有权限操作');
            if ($driverInfo['status'] == 3) return jsonFail('该司机已删除无法继续操作');
            // 重组数据
            $routeIds =  strlen($input['route_ids']) == 0 ? [] : explode(',', $input['route_ids']);
            $oldRouteIds = strlen($input['old_route_ids']) == 0 ? [] : explode(',', $input['old_route_ids']);
            $insert = array_values(array_diff($routeIds, $oldRouteIds)); // 需要添加的数据
            $delete = array_values(array_diff($oldRouteIds, $routeIds)); // 需要移除的数据
            Db::startTrans();
            $flag = true;
            $rtn1 = 0;
            if ($insert) {
                $i = 0;
                $insertData = [];
                while (true) {
                    if (!isset($insert[$i])) break;
                    $insertData[] = [
                        'driver_id' => $input['id'],
                        'move_id' =>  $insert[$i]
                    ];
                    $i++;
                }
                $rtn1 = Db::table(self::$_routeTable)->insertAll($insertData);
            }
            $rtn2 = 0;
            if ($delete) {
                $rtn2 = Db::table(self::$_routeTable)->where('driver_id', $input['id'])->where('move_id', 'in', $delete)->delete();
            }
            if ($rtn1 == count($insert) && $rtn2 == count($delete)) {
                Db::commit();
                return jsonSuccess('委派路线成功');
            }
            Db::rollback();
            return jsonFail('委派路线失败');
        } catch (Exception $e) {
            if ($flag == true) Db::rollback();
            return jsonFail('服务内部错误~');
        }
    }
}